home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_lrm / lr7avcb.src < prev    next >
Text File  |  1996-01-30  |  41KB  |  1,251 lines

  1.  
  2.  
  3. --                ON-LINE Ada LANGUAGE REFERENCE MANUAL
  4. --        Developed at Nofolk State University
  5. --        Development funded by a grant from the U. S. Army
  6. --        Project ReDTEA
  7. --        Version 1.0 released December 1988
  8. --        Programmer:        Esther M. Lumsdon
  9. --        Project Director:  George C. Harrison, PhD
  10.  
  11.  
  12.  
  13. package body LRM_NON_SMG is 
  14.  
  15.  
  16.  
  17.   procedure INITIALIZE is 
  18.   --    Initialization for on-line Ada Language Reference Manual
  19.   --
  20.   --
  21.   ----------------------------------------------------------------------------
  22.     procedure DECIDE_TERM_CATEGORY(USING_DEC_TERMINAL : out BOOLEAN) is 
  23.  
  24.       CHOSE_TERMINAL_CATEGORY : BOOLEAN; 
  25.       TERM_CATEGORY           : STRING(1 .. 5); 
  26.       TERM_CATEGORY_LENGTH    : NATURAL; 
  27.  
  28.  
  29.     begin
  30.  
  31.       loop
  32.         CLS; 
  33.         PUT_LINE("  The following terminals are available for your use at NSU:")
  34.           ; 
  35.         PUT_LINE("Category A terminals:"); 
  36.         PUT_LINE("    VISUAL brand terminals"); 
  37.         PUT_LINE("    TeleVideo brand terminals"); 
  38.         PUT_LINE("    DEC terminals"); 
  39.         NEW_LINE; 
  40.         PUT_LINE("Category B terminals:"); 
  41.         PUT_LINE("    ADM brand terminals"); 
  42.         PUT_LINE("    Adds-Viewpoint terminals"); 
  43.         PUT_LINE("    Hazeltine brand terminals"); 
  44.         NEW_LINE(2); 
  45.         PUT(
  46.           "Please enter A or B for the category of terminal that you are using: "
  47.           ); 
  48.         GET_LINE(TERM_CATEGORY, TERM_CATEGORY_LENGTH); 
  49.         CHOSE_TERMINAL_CATEGORY := TRUE; 
  50.         case TERM_CATEGORY(1) is 
  51.           when 'A' | ASCII.LC_A => 
  52.             USING_DEC_TERMINAL := TRUE; 
  53.           when 'B' | ASCII.LC_B => 
  54.             USING_DEC_TERMINAL := FALSE; 
  55.           when others => 
  56.             CHOSE_TERMINAL_CATEGORY := FALSE; 
  57.         end case; 
  58.         exit when CHOSE_TERMINAL_CATEGORY; 
  59.       end loop; 
  60.  
  61.     end DECIDE_TERM_CATEGORY; 
  62.  
  63.  
  64.  
  65.  
  66.   begin
  67.     USING_DEC_TERMINAL := FALSE; 
  68.   end INITIALIZE; 
  69.  
  70.  
  71.  
  72.  
  73. ------------------------------------------------------------------------------
  74.  
  75.  
  76.   procedure TERMINATE_LRM is 
  77.  
  78.   begin
  79.     if IS_OPEN(SAVE_FILE) then 
  80.       CLOSE(SAVE_FILE); 
  81.     end if; 
  82.     CLS; 
  83.     NEW_LINE(2); 
  84.     PUT_LINE("Thank you for using the Ada Language Reference Manual Reader."); 
  85.   end TERMINATE_LRM; 
  86.  
  87.  
  88. ------------------------------------------------------------------------------
  89.  
  90.   procedure DISPLAY_MAIN_MENU(IN_FILE_NAME : in STRING) is 
  91.  
  92.  
  93.  
  94.   -- read menu text from file, and put entire file on screen.
  95.  
  96.     EMPTY_STRING_80 : STRING(1 .. 80); 
  97.     LAST_CHAR       : NATURAL := 0; 
  98.     READ_IN_FILE    : FILE_TYPE; 
  99.     READ_IN_LINE    : STRING(1 .. 80); 
  100.  
  101.  
  102.   begin
  103.     EMPTY_STRING_80 := (others => ' '); 
  104.     if not USING_DEC_TERMINAL then 
  105.       OPEN(READ_IN_FILE, IN_FILE, IN_FILE_NAME); 
  106.       while not END_OF_FILE(READ_IN_FILE) loop
  107.         READ_IN_LINE := EMPTY_STRING_80; 
  108.         GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  109.         PUT_LINE(READ_IN_LINE(1 .. SCREEN_WIDTH)); 
  110.       end loop; 
  111.     end if; 
  112.  
  113.   end DISPLAY_MAIN_MENU; 
  114.  
  115.  
  116.  
  117.  
  118. ------------------------------------------------------------------------------
  119.  
  120.   procedure DISPLAY_MENU(IN_FILE_NAME : in STRING) is 
  121.  
  122.  
  123.  
  124.   -- read menu text from file, and put entire file on screen.
  125.  
  126.     EMPTY_STRING_80 : STRING(1 .. 80); 
  127.     LAST_CHAR       : NATURAL := 0; 
  128.     READ_IN_FILE    : FILE_TYPE; 
  129.     READ_IN_LINE    : STRING(1 .. 80); 
  130.  
  131.  
  132.   begin
  133.     EMPTY_STRING_80 := (others => ' '); 
  134.  
  135.     OPEN(READ_IN_FILE, IN_FILE, IN_FILE_NAME); 
  136.     while not END_OF_FILE(READ_IN_FILE) loop
  137.       READ_IN_LINE := EMPTY_STRING_80; 
  138.       GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  139.       PUT_LINE(READ_IN_LINE(1 .. SCREEN_WIDTH)); 
  140.     end loop; 
  141.  
  142.   end DISPLAY_MENU; 
  143.  
  144.  
  145.  
  146.  
  147.  
  148.   ---------------------------------------------------------------------------
  149.  
  150.   procedure SCROLL_TEXT(IN_FILE_NAME : in STRING; 
  151.                         SAVE_TITLE   : in STRING; 
  152.                         SAVE_FILE    : in out FILE_TYPE) is 
  153.  
  154.  
  155.   -- scroll text file on the screen, 19 lines at a time
  156.  
  157.     type COMMAND is (CONTINUE, DISPLAY_AGAIN, EXIT_COMMAND, SAVE, NOTHING); 
  158.  
  159.     BLANK_COUNT        : NATURAL := 0; 
  160.     CURRENT_LINE       : NATURAL := 0; 
  161.     CURSOR_CONTROL_STR : STRING(1 .. 7) := "       "; 
  162.     EXIT_NOW           : BOOLEAN := FALSE; 
  163.     GOOD_ANSWER        : BOOLEAN; 
  164.     LAST_CHAR          : NATURAL := 0; 
  165.     LAST_COMMAND       : COMMAND := NOTHING; 
  166.     READ_IN_FILE       : FILE_TYPE; 
  167.     READ_IN_LINE       : STRING(1 .. 80); 
  168.     EMPTY_STRING_80    : STRING(1 .. 80); 
  169.     SAVING             : BOOLEAN := FALSE; 
  170.     TARGET_LINE        : NATURAL; 
  171.     WAIT_STR           : STRING(1 .. 10); 
  172.     WAIT_STR_LENGTH    : NATURAL; 
  173.     LINE_COUNT         : NATURAL := 0; 
  174.  
  175.   begin
  176.     EMPTY_STRING_80 := (others => ' '); 
  177.     OPEN(READ_IN_FILE, IN_FILE, IN_FILE_NAME); 
  178.  
  179.     while not EXIT_NOW loop
  180.       LINE_COUNT := 0; 
  181.       if LAST_COMMAND /= SAVE then 
  182.  
  183.         while ((not END_OF_FILE(READ_IN_FILE)) and (LINE_COUNT < (SCREEN_HEIGHT
  184.           - 3))) loop
  185.           if LINE_COUNT = 0 then 
  186.             CLS; 
  187.           end if; 
  188.           READ_IN_LINE := EMPTY_STRING_80; 
  189.           GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  190.           if LAST_CHAR = 0 then 
  191.             BLANK_COUNT := BLANK_COUNT + 1; 
  192.           else 
  193.             BLANK_COUNT := 0; 
  194.           end if; 
  195.           if BLANK_COUNT < 3 then 
  196.             if LAST_CHAR > (SCREEN_WIDTH) then 
  197.               PUT_LINE(READ_IN_LINE(1 .. SCREEN_WIDTH)); 
  198.               PUT_LINE(READ_IN_LINE(SCREEN_WIDTH + 1 .. LAST_CHAR)); 
  199.               LINE_COUNT := LINE_COUNT + 2; 
  200.             else 
  201.               PUT_LINE(READ_IN_LINE(1 .. SCREEN_WIDTH)); 
  202.               LINE_COUNT := LINE_COUNT + 1; 
  203.             end if; 
  204.           end if; 
  205.           if SAVING then 
  206.             PUT_LINE(SAVE_FILE, READ_IN_LINE(1 .. LAST_CHAR)); 
  207.           end if; 
  208.           CURRENT_LINE := CURRENT_LINE + 1; 
  209.         end loop; 
  210.  
  211.       end if; 
  212.  
  213.       GOOD_ANSWER := FALSE; 
  214.       while not GOOD_ANSWER loop
  215.         GOOD_ANSWER := TRUE; 
  216.         if LINE < 21 then 
  217.           CURSOR_CONTROL_STR(2 .. 4) := INTEGER'IMAGE(SCREEN_HEIGHT); 
  218.           CURSOR_CONTROL_STR(2) := '['; 
  219.           CURSOR_CONTROL_STR(5 .. 7) := ";1H"; 
  220.           CURSOR_CONTROL_STR(1) := ASCII.ESC; 
  221.           PUT_LINE(CURSOR_CONTROL_STR); 
  222.  
  223.         -- cursor_control_str contains ASCII.ESC & "[nn;1H"
  224.         end if; 
  225.  
  226.         -- put cursor on line screen_height of screen
  227.         WAIT_STR(1) := 'c'; 
  228.         if END_OF_FILE(READ_IN_FILE) then 
  229.           PUT("     E[xit]   S[ave]   D[isplay again] "); 
  230.           GET_LINE(WAIT_STR, WAIT_STR_LENGTH); 
  231.         else 
  232.           PUT("     E[xit]   C[ontinue]   S[ave]   D[isplay again] "); 
  233.           GET_LINE(WAIT_STR, WAIT_STR_LENGTH); 
  234.         end if; 
  235.         case WAIT_STR(1) is 
  236.           when 'E' | ASCII.LC_E => 
  237.             LAST_COMMAND := EXIT_COMMAND; 
  238.             EXIT_NOW := TRUE; 
  239.             exit; 
  240.           when 'S' | ASCII.LC_S => 
  241.             LAST_COMMAND := SAVE; 
  242.             if not SAVING then 
  243.               if not IS_OPEN(SAVE_FILE) then 
  244.                 CREATE(SAVE_FILE, OUT_FILE, LRM_READER_SAVE_FILE_NAME); 
  245.               end if; 
  246.               PUT_LINE(SAVE_FILE, 
  247.                 "Reference from Ada Language Reference Manual:"); 
  248.               PUT_LINE(SAVE_FILE, SAVE_TITLE); 
  249.  
  250.               -- write title of what is being saved to save_file.
  251.               NEW_LINE(SAVE_FILE, 2); 
  252.               SAVING := TRUE; 
  253.               if CURRENT_LINE > 1 then 
  254.                 RESET(READ_IN_FILE, IN_FILE); 
  255.                 for I in 1 .. CURRENT_LINE loop
  256.                   GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  257.                   PUT_LINE(SAVE_FILE, READ_IN_LINE(1 .. LAST_CHAR)); 
  258.                 end loop; 
  259.               end if; 
  260.             end if; 
  261.           when 'D' | ASCII.LC_D => 
  262.             LAST_COMMAND := DISPLAY_AGAIN; 
  263.             RESET(READ_IN_FILE, IN_FILE); 
  264.             CURRENT_LINE := 0; 
  265.           when 'C' | ASCII.LC_C => 
  266.             LAST_COMMAND := CONTINUE; 
  267.  
  268.           -- continue the display
  269.           when others => 
  270.             GOOD_ANSWER := FALSE; 
  271.             PUT_LINE(ASCII.ESC & "[39D"); 
  272.  
  273.         -- put cursor at column 1 of the line its on.
  274.         end case; 
  275.  
  276.       -- while not good_answer loop
  277.       end loop; 
  278.  
  279.     --  while not eof(read_in_file) loop
  280.     end loop; 
  281.  
  282.  
  283.     if SAVING then 
  284.       NEW_LINE(SAVE_FILE, 3); 
  285.     end if; 
  286.     CLOSE(READ_IN_FILE); 
  287.  
  288.  
  289.   end SCROLL_TEXT; 
  290.  
  291.  
  292.  
  293.  
  294.  
  295. ------------------------------------------------------------------------------
  296.  
  297. ------------------------------------------------------------------------------
  298.  
  299.   procedure WELCOME(IN_FILE_NAME : in STRING) is 
  300.  
  301.  
  302.  
  303.   --  display welcome message
  304.  
  305.     CURSOR_CONTROL_STR     : STRING(1 .. 7) := "       "; 
  306.     LAST_CHAR              : NATURAL := 0; 
  307.     LINE_COUNT             : NATURAL; 
  308.     STR_TO_CONTINUE        : STRING(1 .. 5); 
  309.     STR_TO_CONTINUE_LENGTH : NATURAL; 
  310.     WELCOME_FILE           : FILE_TYPE; 
  311.     -- menu.welcome_msg is 19 lines x 80 cols
  312.     WELCOME_LINE           : STRING(1 .. 80); 
  313.  
  314.  
  315.  
  316.  
  317.   begin
  318.     OPEN(WELCOME_FILE, IN_FILE, IN_FILE_NAME); 
  319.  
  320.     -- file "menu.welcome_msg"
  321.     GET_LINE(WELCOME_FILE, WELCOME_LINE, LAST_CHAR); 
  322.     CLS; 
  323.  
  324.     while not END_OF_FILE(WELCOME_FILE) loop
  325.       GET_LINE(WELCOME_FILE, WELCOME_LINE, LAST_CHAR); 
  326.       SKIP_LINE(WELCOME_FILE); 
  327.       PUT_LINE(WELCOME_LINE(1 .. SCREEN_WIDTH)); 
  328.     end loop; 
  329.  
  330.     CURSOR_CONTROL_STR(2 .. 4) := INTEGER'IMAGE(SCREEN_HEIGHT); 
  331.     CURSOR_CONTROL_STR(2) := '['; 
  332.     CURSOR_CONTROL_STR(5 .. 7) := ";1H"; 
  333.     CURSOR_CONTROL_STR(1) := ASCII.ESC; 
  334.     PUT_LINE(CURSOR_CONTROL_STR); 
  335.     PUT("   Strike RETURN to continue: "); 
  336.     GET_LINE(STR_TO_CONTINUE, STR_TO_CONTINUE_LENGTH); 
  337.  
  338.     CLOSE(WELCOME_FILE); 
  339.   end WELCOME; 
  340.  
  341.  
  342.  
  343.  
  344.   ---------------------------------------------------------------------------
  345.  
  346.   procedure CREDITS(SAVE_FILE : in out FILE_TYPE) is 
  347.  
  348.  
  349.  
  350.   -- scroll credit on the screen
  351.  
  352.  
  353.   begin
  354.     CLS; 
  355.     SCROLL_TEXT(CREDITS_FILE_NAME, "Credits          ", SAVE_FILE); 
  356.   end CREDITS; 
  357.  
  358.   ---------------------------------------------------------------------------
  359.  
  360. ------------------------------------------------------------------------------
  361.  
  362.   procedure DISPLAY_EXPLAIN(IN_FILE_NAME : in STRING) is 
  363.  
  364.  
  365.  
  366.  
  367.   -- scroll text file on the screen, 19 lines at a time
  368.  
  369.     CURSOR_CONTROL_STR : STRING(1 .. 7) := "       "; 
  370.     GOOD_ANSWER        : BOOLEAN; 
  371.     LAST_CHAR          : NATURAL := 0; 
  372.     READ_IN_FILE       : FILE_TYPE; 
  373.     READ_IN_LINE       : STRING(1 .. 80); 
  374.     EMPTY_STRING_80    : STRING(1 .. 80); 
  375.     WAIT_STR           : STRING(1 .. 10); 
  376.     WAIT_STR_LENGTH    : NATURAL; 
  377.     LINE_COUNT         : NATURAL := 0; 
  378.  
  379.   begin
  380.     EMPTY_STRING_80 := (others => ' '); 
  381.     OPEN(READ_IN_FILE, IN_FILE, IN_FILE_NAME); 
  382.     CLS; 
  383.  
  384.     while not (END_OF_FILE(READ_IN_FILE)) loop
  385.  
  386.       LINE_COUNT := 0; 
  387.  
  388.       while (LINE_COUNT < (SCREEN_HEIGHT - 2)) loop
  389.         READ_IN_LINE := EMPTY_STRING_80; 
  390.         if not END_OF_FILE(READ_IN_FILE) then 
  391.           GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  392.  
  393.           if LAST_CHAR > SCREEN_WIDTH then 
  394.             PUT_LINE(READ_IN_LINE(1 .. SCREEN_WIDTH)); 
  395.             PUT_LINE(READ_IN_LINE(SCREEN_WIDTH + 1 .. LAST_CHAR)); 
  396.             LINE_COUNT := LINE_COUNT + 1; 
  397.           else 
  398.             PUT_LINE(READ_IN_LINE(1 .. LAST_CHAR)); 
  399.             LINE_COUNT := LINE_COUNT + 1; 
  400.           end if; 
  401.         else 
  402.           exit; 
  403.         end if; 
  404.       end loop; 
  405.       CURSOR_CONTROL_STR(2 .. 4) := INTEGER'IMAGE(SCREEN_HEIGHT); 
  406.       CURSOR_CONTROL_STR(2) := '['; 
  407.       CURSOR_CONTROL_STR(5 .. 7) := ";1H"; 
  408.       CURSOR_CONTROL_STR(1) := ASCII.ESC; 
  409.       PUT_LINE(CURSOR_CONTROL_STR); 
  410.       PUT("    Strike RETURN to continue:  "); 
  411.       GET_LINE(WAIT_STR, WAIT_STR_LENGTH); 
  412.  
  413.     --  while not eof(read_in_file) loop
  414.     end loop; 
  415.  
  416.     CLOSE(READ_IN_FILE); 
  417.  
  418.  
  419.   end DISPLAY_EXPLAIN; 
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426. ------------------------------------------------------------------------------
  427.  
  428.   procedure SELECT_FROM_MAIN_MENU(MAIN_MENU_CHOICE : out STRING) is 
  429.  
  430.     CURSOR_CONTROL_STR   : STRING(1 .. 7) := "       "; 
  431.     MAIN_MENU_CHOICE_LEN : NATURAL; 
  432.  
  433.   begin
  434.     CLS; 
  435.     NEW_LINE(2); 
  436.     DISPLAY_MENU(MENU_MAIN_FILE_NAME); 
  437.     CURSOR_CONTROL_STR(2 .. 4) := INTEGER'IMAGE(SCREEN_HEIGHT); 
  438.     CURSOR_CONTROL_STR(2) := '['; 
  439.     CURSOR_CONTROL_STR(5 .. 7) := ";1H"; 
  440.     CURSOR_CONTROL_STR(1) := ASCII.ESC; 
  441.     PUT_LINE(CURSOR_CONTROL_STR); 
  442.     PUT("Choose from 1 - 7, please: "); 
  443.     GET_LINE(MAIN_MENU_CHOICE, MAIN_MENU_CHOICE_LEN); 
  444.   end SELECT_FROM_MAIN_MENU; 
  445.  
  446. ------------------------------------------------------------------------------
  447.  
  448.   procedure DO_ANNEX_MENU(SAVE_FILE : in out FILE_TYPE) is 
  449.  
  450.     ANNEX_MENU_CHOICE     : STRING(1 .. 5); 
  451.     ANNEX_MENU_CHOICE_LEN : NATURAL; 
  452.     CURSOR_CONTROL_STR    : STRING(1 .. 7) := "       "; 
  453.  
  454.   begin
  455.     loop
  456.       CLS; 
  457.       DISPLAY_MENU(MENU_ANNEX_FILE_NAME); 
  458.       NEW_LINE(5); 
  459.       CURSOR_CONTROL_STR(2 .. 4) := INTEGER'IMAGE(SCREEN_HEIGHT); 
  460.       CURSOR_CONTROL_STR(2) := '['; 
  461.       CURSOR_CONTROL_STR(5 .. 7) := ";1H"; 
  462.       CURSOR_CONTROL_STR(1) := ASCII.ESC; 
  463.       PUT_LINE(CURSOR_CONTROL_STR); 
  464.       PUT("Choose from A - F or Q, please: "); 
  465.       GET_LINE(ANNEX_MENU_CHOICE, ANNEX_MENU_CHOICE_LEN); 
  466.       case ANNEX_MENU_CHOICE(1) is 
  467.         when 'A' | 'a' => 
  468.           SCROLL_TEXT(LRM_FILE_NAME_PREFIX(1 .. LRM_FILE_NAME_PREFIX_LENGTH) & 
  469.             "chapa.doc", "Annex A          ", SAVE_FILE); 
  470.         when 'B' | 'b' => 
  471.           SCROLL_TEXT(LRM_FILE_NAME_PREFIX(1 .. LRM_FILE_NAME_PREFIX_LENGTH) & 
  472.             "chapb.doc", "Annex B          ", SAVE_FILE); 
  473.         when 'C' | 'c' => 
  474.           SCROLL_TEXT(LRM_FILE_NAME_PREFIX(1 .. LRM_FILE_NAME_PREFIX_LENGTH) & 
  475.             "chapc.doc", "Annex C          ", SAVE_FILE); 
  476.         when 'D' | 'd' => 
  477.           SCROLL_TEXT(LRM_FILE_NAME_PREFIX(1 .. LRM_FILE_NAME_PREFIX_LENGTH) & 
  478.             "chapd.doc", "Annex D          ", SAVE_FILE); 
  479.         when 'E' | 'e' => 
  480.           SCROLL_TEXT(LRM_FILE_NAME_PREFIX(1 .. LRM_FILE_NAME_PREFIX_LENGTH) & 
  481.             "chape.doc", "Annex E          ", SAVE_FILE); 
  482.         when 'F' | 'f' => 
  483.           SCROLL_TEXT(LRM_FILE_NAME_PREFIX(1 .. LRM_FILE_NAME_PREFIX_LENGTH) & 
  484.             "chapf.doc", "Annex F          ", SAVE_FILE); 
  485.         when 'Q' | 'q' => 
  486.           exit; 
  487.         when others => 
  488.           null; 
  489.       end case; 
  490.     end loop; 
  491.  
  492.  
  493.   end DO_ANNEX_MENU; 
  494.  
  495.  
  496.  
  497.   ---------------------------------------------------------------------------
  498.  
  499. ------------------------------------------------------------------------------
  500.  
  501.  
  502.  
  503.  
  504.   procedure DISPLAY_CHAPTER_MENU(IN_FILE_NAME : in STRING) is 
  505.  
  506.  
  507.  
  508.   -- read menu text from file, and put entire file on screen.
  509.  
  510.     EMPTY_STRING_80 : STRING(1 .. 80); 
  511.     LAST_CHAR       : NATURAL := 0; 
  512.     READ_IN_FILE    : FILE_TYPE; 
  513.     READ_IN_LINE    : STRING(1 .. 80); 
  514.  
  515.  
  516.   begin
  517.     EMPTY_STRING_80 := (others => ' '); 
  518.  
  519.     OPEN(READ_IN_FILE, IN_FILE, IN_FILE_NAME); 
  520.     CLS; 
  521.     while not END_OF_FILE(READ_IN_FILE) loop
  522.       READ_IN_LINE := EMPTY_STRING_80; 
  523.       GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  524.       PUT_LINE(READ_IN_LINE(1 .. SCREEN_WIDTH)); 
  525.     end loop; 
  526.  
  527.   end DISPLAY_CHAPTER_MENU; 
  528.  
  529.  
  530. ------------------------------------------------------------------------------
  531.  
  532.  
  533. ------------------------------------------------------------------------------
  534.  
  535.   procedure SCROLL_CHAP(IN_FILE_NAME       : in STRING; 
  536.                         FIRST_LINE         : in out NATURAL; 
  537.                         LAST_LINE          : in NATURAL; 
  538.                         SAVE_FILE          : in out FILE_TYPE; 
  539.                         UNTIL_EOF          : in BOOLEAN; 
  540.                         CITATION_REQUESTED : in STRING) is 
  541.  
  542.  
  543.  
  544.  
  545.   -- scroll text file on the screen, 19 lines at a time
  546.  
  547.     type COMMAND is (CONTINUE, DISPLAY_AGAIN, EXIT_COMMAND, SAVE, NOTHING); 
  548.  
  549.     AT_LAST_LINE       : BOOLEAN := FALSE; 
  550.     BLANK_30           : STRING(1 .. 30) := (others => ' '); 
  551.     BLANK_COUNT        : NATURAL := 0; 
  552.     CURRENT_LINE       : NATURAL := 0; 
  553.     CURSOR_CONTROL_STR : STRING(1 .. 7) := "       "; 
  554.     EXIT_NOW           : BOOLEAN := FALSE; 
  555.     GOOD_ANSWER        : BOOLEAN; 
  556.     LAST_CHAR          : NATURAL := 0; 
  557.     LAST_COMMAND       : COMMAND := NOTHING; 
  558.     READ_IN_FILE       : FILE_TYPE; 
  559.     READ_IN_LINE       : STRING(1 .. 156); 
  560.     EMPTY_STRING_156   : STRING(1 .. 156); 
  561.     SAVING             : BOOLEAN := FALSE; 
  562.     TARGET_LINE        : NATURAL; 
  563.     WAIT_STR           : STRING(1 .. 10); 
  564.     WAIT_STR_LENGTH    : NATURAL; 
  565.     LINE_COUNT         : NATURAL := 0; 
  566.  
  567.     procedure GOTO_FIRST_LINE(FIRST_LINE : in NATURAL) is 
  568.       READ_IN_LINE : STRING(1 .. 156); 
  569.       LAST_CHAR    : NATURAL; 
  570.  
  571.     begin
  572.       RESET(READ_IN_FILE, IN_FILE); 
  573.       for I in 1 .. (FIRST_LINE - 1) loop
  574.         GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  575.       end loop; 
  576.     end GOTO_FIRST_LINE; 
  577.  
  578.  
  579.   begin
  580.     EMPTY_STRING_156 := (others => ' '); 
  581.     OPEN(READ_IN_FILE, IN_FILE, IN_FILE_NAME); 
  582.     GOTO_FIRST_LINE(FIRST_LINE); 
  583.     CURRENT_LINE := FIRST_LINE - 1; 
  584.  
  585.     while not EXIT_NOW loop
  586.       CLS; 
  587.       LINE_COUNT := 0; 
  588.       if LAST_COMMAND /= SAVE then 
  589.  
  590.         if UNTIL_EOF then 
  591.  
  592.           while ((not END_OF_FILE(READ_IN_FILE)) and (LINE_COUNT < (
  593.             SCREEN_HEIGHT - 3))) loop
  594.             READ_IN_LINE := EMPTY_STRING_156; 
  595.             GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  596.  
  597.             --          don't need a SKIP_LINE statement.
  598.             --          SKIP_LINE (READ_IN_FILE);
  599.             if LAST_CHAR = 0 then 
  600.               BLANK_COUNT := BLANK_COUNT + 1; 
  601.             else 
  602.               BLANK_COUNT := 0; 
  603.             end if; 
  604.             if SAVING then 
  605.               PUT_LINE(SAVE_FILE, READ_IN_LINE(1 .. LAST_CHAR)); 
  606.             end if; 
  607.             CURRENT_LINE := CURRENT_LINE + 1; 
  608.             if BLANK_COUNT < 3 then 
  609.               if LAST_CHAR > SCREEN_WIDTH then 
  610.                 PUT_LINE(READ_IN_LINE(1 .. SCREEN_WIDTH)); 
  611.                 PUT_LINE(READ_IN_LINE(SCREEN_WIDTH + 1 .. LAST_CHAR)); 
  612.                 LINE_COUNT := LINE_COUNT + 2; 
  613.               else 
  614.                 PUT_LINE(READ_IN_LINE(1 .. LAST_CHAR)); 
  615.                 LINE_COUNT := LINE_COUNT + 1; 
  616.               end if; 
  617.             end if; 
  618.           end loop; 
  619.  
  620.         else 
  621.  
  622.           while ((CURRENT_LINE < LAST_LINE) and (LINE_COUNT <= (SCREEN_HEIGHT - 
  623.             3))) loop
  624.             READ_IN_LINE := EMPTY_STRING_156; 
  625.             GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  626.             if LAST_CHAR = 0 then 
  627.               BLANK_COUNT := BLANK_COUNT + 1; 
  628.             else 
  629.               BLANK_COUNT := 0; 
  630.             end if; 
  631.             if SAVING then 
  632.               PUT_LINE(SAVE_FILE, READ_IN_LINE(1 .. LAST_CHAR)); 
  633.             end if; 
  634.             CURRENT_LINE := CURRENT_LINE + 1; 
  635.             if BLANK_COUNT < 3 then 
  636.               if (not (LAST_CHAR < 42 and LAST_CHAR > 0 and READ_IN_LINE(1 .. 30
  637.                 ) = BLANK_30)) then 
  638.                 if LAST_CHAR > SCREEN_WIDTH then 
  639.                   PUT_LINE(READ_IN_LINE(1 .. SCREEN_WIDTH)); 
  640.                   PUT_LINE(READ_IN_LINE(SCREEN_WIDTH + 1 .. LAST_CHAR)); 
  641.                   LINE_COUNT := LINE_COUNT + 2; 
  642.                 else 
  643.                   PUT_LINE(READ_IN_LINE(1 .. LAST_CHAR)); 
  644.                   LINE_COUNT := LINE_COUNT + 1; 
  645.                 end if; 
  646.               end if; 
  647.             end if; 
  648.           end loop; 
  649.           if CURRENT_LINE >= (LAST_LINE - 1) then 
  650.             AT_LAST_LINE := TRUE; 
  651.           end if; 
  652.         end if; 
  653.  
  654.  
  655.       end if; 
  656.  
  657.       GOOD_ANSWER := FALSE; 
  658.       while not GOOD_ANSWER loop
  659.         GOOD_ANSWER := TRUE; 
  660.         CURSOR_CONTROL_STR(2 .. 4) := INTEGER'IMAGE(SCREEN_HEIGHT); 
  661.         CURSOR_CONTROL_STR(2) := '['; 
  662.         CURSOR_CONTROL_STR(5 .. 7) := ";1H"; 
  663.         CURSOR_CONTROL_STR(1) := ASCII.ESC; 
  664.         PUT_LINE(CURSOR_CONTROL_STR); 
  665.  
  666.         -- put cursor on line SCREEN_HEIGHT of screen
  667.         WAIT_STR(1) := 'c'; 
  668.         if END_OF_FILE(READ_IN_FILE) or (AT_LAST_LINE) then 
  669.           PUT("     E[xit]   S[ave]   D[isplay again] "); 
  670.           GET_LINE(WAIT_STR, WAIT_STR_LENGTH); 
  671.         else 
  672.           PUT("     E[xit]   C[ontinue]   S[ave]   D[isplay again] "); 
  673.           GET_LINE(WAIT_STR, WAIT_STR_LENGTH); 
  674.         end if; 
  675.         case WAIT_STR(1) is 
  676.           when 'E' | ASCII.LC_E => 
  677.             LAST_COMMAND := EXIT_COMMAND; 
  678.             EXIT_NOW := TRUE; 
  679.             exit; 
  680.           when 'S' | ASCII.LC_S => 
  681.             LAST_COMMAND := SAVE; 
  682.             if not SAVING then 
  683.               if not IS_OPEN(SAVE_FILE) then 
  684.                 CREATE(SAVE_FILE, OUT_FILE, LRM_READER_SAVE_FILE_NAME); 
  685.               end if; 
  686.               PUT_LINE(SAVE_FILE, 
  687.                 "Chapter reference from Ada Language Reference Manual:"); 
  688.               for I in 1 .. 11 loop
  689.                 case CITATION_REQUESTED(I) is 
  690.                   when 'c' | 'C' => 
  691.                     PUT(SAVE_FILE, "Chapter "); 
  692.                   when 's' | 'S' => 
  693.                     PUT(SAVE_FILE, " Section "); 
  694.                   when 'v' | 'V' => 
  695.                     PUT(SAVE_FILE, '.'); 
  696.                   when 'p' | 'P' => 
  697.                     PUT(SAVE_FILE, " Paragraph "); 
  698.                   when ' ' => 
  699.                     null; 
  700.                   when others => 
  701.                     PUT(SAVE_FILE, CITATION_REQUESTED(I)); 
  702.                 end case; 
  703.               end loop; 
  704.               NEW_LINE(SAVE_FILE, 3); 
  705.  
  706.               -- write citation title to file save_file.
  707.               SAVING := TRUE; 
  708.               if CURRENT_LINE > FIRST_LINE then 
  709.                 GOTO_FIRST_LINE(FIRST_LINE); 
  710.                 for I in FIRST_LINE .. CURRENT_LINE loop
  711.                   READ_IN_LINE := EMPTY_STRING_156; 
  712.                   GET_LINE(READ_IN_FILE, READ_IN_LINE, LAST_CHAR); 
  713.                   PUT_LINE(SAVE_FILE, READ_IN_LINE(1 .. LAST_CHAR)); 
  714.                 end loop; 
  715.               end if; 
  716.             end if; 
  717.           when 'D' | ASCII.LC_D => 
  718.             LAST_COMMAND := DISPLAY_AGAIN; 
  719.             GOTO_FIRST_LINE(FIRST_LINE); 
  720.             CURRENT_LINE := FIRST_LINE - 1; 
  721.           when 'C' | ASCII.LC_C => 
  722.             LAST_COMMAND := CONTINUE; 
  723.  
  724.           -- continue the display
  725.           when others => 
  726.             GOOD_ANSWER := FALSE; 
  727.         end case; 
  728.  
  729.       -- while not good_answer loop
  730.       end loop; 
  731.  
  732.     --  while not eof(read_in_file) loop
  733.     end loop; 
  734.  
  735.  
  736.     if SAVING then 
  737.       NEW_LINE(SAVE_FILE, 3); 
  738.     end if; 
  739.     CLOSE(READ_IN_FILE); 
  740.  
  741.  
  742.   end SCROLL_CHAP; 
  743.  
  744.  
  745.  
  746.  
  747.  
  748. ------------------------------------------------------------------------------
  749.  
  750. ------------------------------------------------------------------------------
  751.  
  752.  
  753.   function EXTRACT_SECTION(CITATION : in STRING) return INTEGER is 
  754.  
  755.   --  Extract integer part of section number from citation.
  756.  
  757.     FOUND         : BOOLEAN := FALSE; 
  758.     I             : INTEGER; 
  759.     FIRST_SECTION : INTEGER := 0; 
  760.     LAST_SECTION  : INTEGER := 0; 
  761.  
  762.   begin
  763.     I := 3; 
  764.     loop
  765.       case CITATION(I) is 
  766.         when 's' | 'S' => 
  767.           FIRST_SECTION := I + 1; 
  768.         when 'v' | 'V' | 'p' | 'P' => 
  769.           LAST_SECTION := I - 1; 
  770.           FOUND := TRUE; 
  771.         when others => 
  772.           null; 
  773.       end case; 
  774.       if I = 11 then 
  775.         exit; 
  776.       else 
  777.         I := I + 1; 
  778.       end if; 
  779.       exit when FOUND; 
  780.     end loop; 
  781.     if not FOUND then 
  782.       for I in reverse 1 .. 11 loop
  783.         if CITATION(I) /= ' ' then 
  784.           LAST_SECTION := I; 
  785.           FOUND := TRUE; 
  786.           exit when FOUND; 
  787.         end if; 
  788.       end loop; 
  789.     end if; 
  790.  
  791.     return INTEGER'VALUE(CITATION(FIRST_SECTION .. LAST_SECTION)); 
  792.   end EXTRACT_SECTION; 
  793.  
  794.  
  795.  
  796.  
  797. ------------------------------------------------------------------------------
  798.  
  799.   function EXTRACT_CHAPTER(CITATION : in STRING) return INTEGER is 
  800.  
  801.   --  Extract chapter from citation.
  802.  
  803.     FOUND     : BOOLEAN := FALSE; 
  804.     I         : INTEGER; 
  805.     LAST_CHAP : INTEGER := 0; 
  806.  
  807.   begin
  808.     I := 2; 
  809.     loop
  810.       case CITATION(I) is 
  811.         when 'p' | 'P' | 's' | 'S' => 
  812.           LAST_CHAP := I - 1; 
  813.           FOUND := TRUE; 
  814.         when others => 
  815.           null; 
  816.       end case; 
  817.       if I = 11 then 
  818.         exit; 
  819.       else 
  820.         I := I + 1; 
  821.       end if; 
  822.       exit when FOUND; 
  823.     end loop; 
  824.     if not FOUND then 
  825.       for I in reverse 1 .. 11 loop
  826.         if CITATION(I) /= ' ' then 
  827.           LAST_CHAP := I; 
  828.           FOUND := TRUE; 
  829.           exit when FOUND; 
  830.         end if; 
  831.       end loop; 
  832.     end if; 
  833.  
  834.     return INTEGER'VALUE(CITATION(2 .. LAST_CHAP)); 
  835.   end EXTRACT_CHAPTER; 
  836.  
  837.  
  838. ------------------------------------------------------------------------------
  839.  
  840.   procedure GET_NEXT_SECTION_NUMBER(NEXT_SECTION : in out STRING; 
  841.                                     LAST_LINE    : in out NATURAL; 
  842.                                     UNTIL_EOF    : in out BOOLEAN; 
  843.                                     SUBSECTION   : in BOOLEAN) is 
  844.  
  845.  
  846.     ORIGINAL_CHAPTER : INTEGER;  -- chapter part of requested chapter reference
  847.     ORIGINAL_SECTION : INTEGER; -- integer part of section of requested chapter reference
  848.     CURRENT_CHAPTER  : INTEGER; 
  849.     CURRENT_SECTION  : INTEGER; 
  850.     -- integer part of section of current chapter reference
  851.     NOT_PARAGRAPH    : BOOLEAN; 
  852.     NS               : LEGAL_CITATIONS; 
  853.     CITATION_STRING  : STRING(1 .. 11); 
  854.  
  855.  
  856.   begin
  857.     LAST_LINE := 0; 
  858.     UNTIL_EOF := FALSE; 
  859.     NS := LEGAL_CITATIONS'VALUE(NEXT_SECTION); 
  860.     ORIGINAL_CHAPTER := EXTRACT_CHAPTER(NEXT_SECTION); 
  861.     ORIGINAL_SECTION := EXTRACT_SECTION(NEXT_SECTION); 
  862.     if SUBSECTION then 
  863.       loop
  864.         NOT_PARAGRAPH := TRUE; 
  865.         if NS /= C14S7P3 then 
  866.           NS := LEGAL_CITATIONS'SUCC(NS); 
  867.         else 
  868.           UNTIL_EOF := TRUE; 
  869.           goto DISPLAY_REMAINDER_OF_FILE; 
  870.         end if; 
  871.  
  872.         --        >>>>>> detect next chapter
  873.         --
  874.         --
  875.         LEGAL_CITATIONS_IO.PUT(NEXT_SECTION, NS); 
  876.         CURRENT_CHAPTER := EXTRACT_CHAPTER(NEXT_SECTION); 
  877.         if CURRENT_CHAPTER > ORIGINAL_CHAPTER then 
  878.           UNTIL_EOF := TRUE; 
  879.           goto DISPLAY_REMAINDER_OF_FILE; 
  880.         end if; 
  881.         for I in reverse 1 .. 11 loop
  882.           if ((NEXT_SECTION(I) = 'p') or (NEXT_SECTION(I) = 'P')) then 
  883.             NOT_PARAGRAPH := FALSE; 
  884.           end if; 
  885.         end loop; 
  886.         if NOT_PARAGRAPH then 
  887.           exit; 
  888.         end if; 
  889.       end loop; 
  890.     else 
  891.       loop
  892.         if NS /= C14S7P3 then 
  893.           NS := LEGAL_CITATIONS'SUCC(NS); 
  894.         else 
  895.           UNTIL_EOF := TRUE; 
  896.           goto DISPLAY_REMAINDER_OF_FILE; 
  897.         end if; 
  898.         LEGAL_CITATIONS_IO.PUT(NEXT_SECTION, NS); 
  899.         CURRENT_CHAPTER := EXTRACT_CHAPTER(NEXT_SECTION); 
  900.         if CURRENT_CHAPTER > ORIGINAL_CHAPTER then 
  901.           UNTIL_EOF := TRUE; 
  902.           goto DISPLAY_REMAINDER_OF_FILE; 
  903.         else 
  904.           CURRENT_SECTION := EXTRACT_SECTION(NEXT_SECTION); 
  905.           if CURRENT_SECTION > ORIGINAL_SECTION then 
  906.             UNTIL_EOF := FALSE; 
  907.             goto DISPLAY_REMAINDER_OF_FILE; 
  908.           end if; 
  909.         end if; 
  910.       end loop; 
  911.  
  912.     -- if subsection
  913.     end if; 
  914.  
  915.     <<DISPLAY_REMAINDER_OF_FILE>> null; 
  916.  
  917.     if not UNTIL_EOF then 
  918.       LAST_LINE := CHAP_POINTERS(NS); 
  919.     end if; 
  920.   end GET_NEXT_SECTION_NUMBER; 
  921.  
  922. ------------------------------------------------------------------------------
  923.  
  924.  
  925.  
  926. ------------------------------------------------------------------------------
  927.   procedure DO_CHAPTER_MENU(SAVE_FILE : in out FILE_TYPE) is 
  928.  
  929.  
  930.     ALL_CHAPTER                    : BOOLEAN := FALSE; 
  931.     ALL_SECTION                    : BOOLEAN := FALSE; 
  932.     CHAP_FILENAME                  : STRING(1 .. 35) := 
  933.       "                                   "; 
  934.     CHAPTER_CHOICE                 : STRING(1 .. 5); 
  935.     CHAPTER_CHOICE_INT             : INTEGER; 
  936.     CHAPTER_CHOICE_LEN_INT         : INTEGER; 
  937.  
  938.     -- strictly local.  
  939.     CITATION_REQUESTED             : STRING(1 .. 11) := "c1p1       "; 
  940.     CITATION_REQUESTED_LENGTH      : NATURAL; 
  941.     CITATION_TO_GET                : LEGAL_CITATIONS := C1P1; 
  942.     CITATION_MARKER                : LEGAL_CITATIONS := C1P1; 
  943.     EXIT_CHAPTER_LOOP              : BOOLEAN; 
  944.     EXIT_CHOICE                    : STRING(1 .. 5); 
  945.     EXIT_CHOICE_LENGTH             : NATURAL; 
  946.     FIRST_LINE                     : NATURAL := 0; 
  947.     FIRST_TIME_THROUGH_OUTER_LOOP  : BOOLEAN := TRUE; 
  948.     GOOD_ANSWER                    : BOOLEAN; 
  949.     I                              : INTEGER :=  -1; 
  950.     LAST_LINE                      : NATURAL := 0; 
  951.     NEXT_CITATION                  : STRING(1 .. 11); 
  952.     NEXT_CITATION_LENGTH           : NATURAL; 
  953.     NONEXISTENT_CITATION_MESSAGE   : STRING(1 .. 78); 
  954.     NONEXISTENT_CITATION_REPLY     : STRING(1 .. 2); 
  955.     NONEXISTENT_CITATION_REPLY_LEN : NATURAL; 
  956.     PARAGRAPH_CHOICE               : STRING(1 .. 5); 
  957.     PARAGRAPH_CHOICE_LEN_INT       : INTEGER; 
  958.     PLACE                          : NATURAL := 0; 
  959.     REQUEST_LENGTH                 : NATURAL := 2; 
  960.     SECTION_BEGIN, SECTION_END     : NATURAL := 0; 
  961.     SECTION_CHOICE                 : STRING(1 .. 10); 
  962.     SECTION_CHOICE_LEN_INT         : INTEGER; 
  963.     SUBSECTION                     : BOOLEAN; 
  964.  
  965.     --strictly local.
  966.     UNTIL_EOF                      : BOOLEAN := FALSE; 
  967.     C1                             : STRING(1 .. 3); 
  968.     C2                             : INTEGER; 
  969.     ROW, COL                       : INTEGER; 
  970.     DUMP_FILE                      : FILE_TYPE; 
  971.  
  972.     ---------------------------------------
  973.     function CHAPTER_NUMBER(CHAP     : in STRING; 
  974.                             CHAP_LEN : in INTEGER) return INTEGER is 
  975.  
  976.     --NOT ABLE TO MAKE THIS GLOBAL
  977.  
  978.       I    : INTEGER; 
  979.       TEMP : INTEGER := 0; 
  980.     begin
  981.       TEMP := INTEGER'VALUE(CHAP(1 .. CHAP_LEN)); 
  982.       return TEMP; 
  983.     end CHAPTER_NUMBER; 
  984.  
  985.     ---------------------------------------
  986.     function VALID_CHAPTER(CHAP : in INTEGER) return BOOLEAN is 
  987.       TEMP_RESULT : BOOLEAN; 
  988.     begin
  989.       case CHAP is 
  990.         when 1 .. 14 => 
  991.           TEMP_RESULT := TRUE; 
  992.         when others => 
  993.           TEMP_RESULT := FALSE; 
  994.       end case; 
  995.       return TEMP_RESULT; 
  996.     end VALID_CHAPTER; 
  997.  
  998.     ---------------------------------------
  999.     procedure GET_CITATION_FROM_USER is 
  1000.  
  1001.     -- local -- term_code
  1002.     -- parameter -- chapter_choice_int
  1003.     begin
  1004.       CHAPTER_CHOICE := "     "; 
  1005.       SECTION_CHOICE := "          "; 
  1006.       PARAGRAPH_CHOICE := "     "; 
  1007.  
  1008.       PUT("Enter chapter, please: "); 
  1009.       GET_LINE(CHAPTER_CHOICE, CHAPTER_CHOICE_LEN_INT); 
  1010.       PUT("              section: "); 
  1011.       GET_LINE(SECTION_CHOICE, SECTION_CHOICE_LEN_INT); 
  1012.       PUT("            paragraph: "); 
  1013.       GET_LINE(PARAGRAPH_CHOICE, PARAGRAPH_CHOICE_LEN_INT); 
  1014.  
  1015.       CHAPTER_CHOICE_INT := INTEGER'VALUE(CHAPTER_CHOICE); 
  1016.       if VALID_CHAPTER(CHAPTER_CHOICE_INT) then 
  1017.         GOOD_ANSWER := TRUE; 
  1018.       end if; 
  1019.     end GET_CITATION_FROM_USER; 
  1020.  
  1021.     ---------------------------------------
  1022.     procedure COMBINE_STRINGS_INTO_IMAGE_FORM is 
  1023.  
  1024.     -- local -- place, request_length, section_begin, section_end
  1025.     begin
  1026.       CITATION_REQUESTED := "           "; 
  1027.       CITATION_REQUESTED_LENGTH := 0; 
  1028.       CITATION_REQUESTED(1) := 'C'; 
  1029.       CITATION_REQUESTED(2 .. 2) := CHAPTER_CHOICE(1 .. 1); 
  1030.       CITATION_REQUESTED(2 .. (CHAPTER_CHOICE_LEN_INT + 1)) := CHAPTER_CHOICE(1
  1031.         .. CHAPTER_CHOICE_LEN_INT); 
  1032.       PLACE := CHAPTER_CHOICE_LEN_INT + 2; 
  1033.       REQUEST_LENGTH := PLACE - 1; 
  1034.       if (SECTION_CHOICE_LEN_INT > 0) then 
  1035.         CITATION_REQUESTED(PLACE) := 'S'; 
  1036.         SECTION_BEGIN := PLACE + 1; 
  1037.         for I in 1 .. SECTION_CHOICE_LEN_INT loop
  1038.           if SECTION_CHOICE(I) = '.' then 
  1039.             CITATION_REQUESTED(PLACE + I) := 'v'; 
  1040.             SUBSECTION := TRUE; 
  1041.           else 
  1042.             CITATION_REQUESTED(PLACE + I) := SECTION_CHOICE(I); 
  1043.           end if; 
  1044.         end loop; 
  1045.         SECTION_END := SECTION_BEGIN + SECTION_CHOICE_LEN_INT - 1; 
  1046.         PLACE := PLACE + SECTION_CHOICE_LEN_INT + 1; 
  1047.         REQUEST_LENGTH := PLACE - 1; 
  1048.         if PARAGRAPH_CHOICE_LEN_INT <= 0 then 
  1049.           ALL_SECTION := TRUE; 
  1050.         end if; 
  1051.       else 
  1052.         if PARAGRAPH_CHOICE_LEN_INT <= 0 then 
  1053.           ALL_CHAPTER := TRUE; 
  1054.         end if; 
  1055.       end if; 
  1056.  
  1057.       -- if section_choice_len_int > 0
  1058.       if (PARAGRAPH_CHOICE_LEN_INT > 0) then 
  1059.         CITATION_REQUESTED(PLACE) := 'P'; 
  1060.         CITATION_REQUESTED((PLACE + 1) .. (PLACE + PARAGRAPH_CHOICE_LEN_INT))
  1061.           := PARAGRAPH_CHOICE(1 .. PARAGRAPH_CHOICE_LEN_INT); 
  1062.         REQUEST_LENGTH := PLACE + PARAGRAPH_CHOICE_LEN_INT; 
  1063.       end if; 
  1064.  
  1065.     -- if paragraph_choice_len_int > 0
  1066.     end COMBINE_STRINGS_INTO_IMAGE_FORM; 
  1067.  
  1068.     ---------------------------------------
  1069.     procedure FILL_IN_CHAPTER_FILENAME(CHAP_FILENAME      : out STRING; 
  1070.                                        CHAPTER_CHOICE_INT : in INTEGER) is 
  1071.  
  1072.       TEMP_CHAP_FILENAME : STRING(1 .. 10) := "chap  .doc"; 
  1073.       TEMP_LENGTH        : NATURAL; 
  1074.  
  1075.     begin
  1076.       if CHAPTER_CHOICE_INT in 1 .. 14 then 
  1077.         case CHAPTER_CHOICE_INT is 
  1078.           when 1 => 
  1079.             TEMP_CHAP_FILENAME(5 .. 6) := "01"; 
  1080.           when 2 => 
  1081.             TEMP_CHAP_FILENAME(5 .. 6) := "02"; 
  1082.           when 3 => 
  1083.             TEMP_CHAP_FILENAME(5 .. 6) := "03"; 
  1084.           when 4 => 
  1085.             TEMP_CHAP_FILENAME(5 .. 6) := "04"; 
  1086.           when 5 => 
  1087.             TEMP_CHAP_FILENAME(5 .. 6) := "05"; 
  1088.           when 6 => 
  1089.             TEMP_CHAP_FILENAME(5 .. 6) := "06"; 
  1090.           when 7 => 
  1091.             TEMP_CHAP_FILENAME(5 .. 6) := "07"; 
  1092.           when 8 => 
  1093.             TEMP_CHAP_FILENAME(5 .. 6) := "08"; 
  1094.           when 9 => 
  1095.             TEMP_CHAP_FILENAME(5 .. 6) := "09"; 
  1096.           when 10 => 
  1097.             TEMP_CHAP_FILENAME(5 .. 6) := "10"; 
  1098.           when 11 => 
  1099.             TEMP_CHAP_FILENAME(5 .. 6) := "11"; 
  1100.           when 12 => 
  1101.             TEMP_CHAP_FILENAME(5 .. 6) := "12"; 
  1102.           when 13 => 
  1103.             TEMP_CHAP_FILENAME(5 .. 6) := "13"; 
  1104.           when 14 => 
  1105.             TEMP_CHAP_FILENAME(5 .. 6) := "14"; 
  1106.           when others => 
  1107.             null; 
  1108.         end case; 
  1109.  
  1110.         -- Length of CHAP_FILENAME := LRM_FILE_NAME_PREFIX_LENGTH
  1111.         -- + Length(TEMP_CHAP_FILENAME)
  1112.         TEMP_LENGTH := LRM_FILE_NAME_PREFIX_LENGTH + 10; 
  1113.         CHAP_FILENAME(1 .. TEMP_LENGTH) := LRM_FILE_NAME_PREFIX(1 .. 
  1114.           LRM_FILE_NAME_PREFIX_LENGTH) & TEMP_CHAP_FILENAME; 
  1115.       end if; 
  1116.     end FILL_IN_CHAPTER_FILENAME; 
  1117.  
  1118.     ---------------------------------------
  1119.     procedure VALIDATE_CITATION(CITATION_REQUESTED : in STRING; 
  1120.                                 REQUEST_LENGTH     : in NATURAL; 
  1121.                                 CITATION_TO_GET    : out LEGAL_CITATIONS) is 
  1122.     begin
  1123.  
  1124.       CITATION_TO_GET := LEGAL_CITATIONS'VALUE(CITATION_REQUESTED(1 .. 
  1125.         REQUEST_LENGTH)); 
  1126.  
  1127.     end VALIDATE_CITATION; 
  1128.  
  1129.     ------------------------------------------------------------
  1130.     --              do_chapter_menu  body
  1131.     ------------------------------------------------------------
  1132.  
  1133.  
  1134.     --do_chapter_menu
  1135.   begin
  1136.  
  1137.     EXIT_CHAPTER_LOOP := FALSE; 
  1138.  
  1139.     loop
  1140.  
  1141.       -- block for exception CONSTRAINT_ERROR
  1142.       begin
  1143.         CLS; 
  1144.         if not FIRST_TIME_THROUGH_OUTER_LOOP then 
  1145.           PUT("Do you want to leave the Chapter Menu now? "); 
  1146.           GET_LINE(EXIT_CHOICE, EXIT_CHOICE_LENGTH); 
  1147.           CLS; 
  1148.         end if; 
  1149.         FIRST_TIME_THROUGH_OUTER_LOOP := FALSE; 
  1150.  
  1151.         case EXIT_CHOICE(1) is 
  1152.           when 'y' | 'Y' => 
  1153.             EXIT_CHAPTER_LOOP := TRUE; 
  1154.           when others => 
  1155.             null; 
  1156.         end case; 
  1157.  
  1158.         exit when EXIT_CHAPTER_LOOP; 
  1159.  
  1160.         DISPLAY_CHAPTER_MENU(MENU_CHAPTER_FILE_NAME); 
  1161.  
  1162.         GOOD_ANSWER := FALSE; 
  1163.         while not GOOD_ANSWER loop
  1164.           GET_CITATION_FROM_USER; 
  1165.         end loop; 
  1166.  
  1167.         -- Combine the contents of strings chapter_choice, section_choice
  1168.         --   and paragraph_choice into one string in the same format as
  1169.         --   the enumerated type legal_citations.
  1170.         SUBSECTION := FALSE; 
  1171.         COMBINE_STRINGS_INTO_IMAGE_FORM; 
  1172.  
  1173.         -- Here we have at least a valid chapter.
  1174.         -- See if its a legal citation.
  1175.         -- If its NOT a legal citation, will raise exception constraint_error,
  1176.         --   perform exception block (when constraint_error), and
  1177.         --   exit procedure do_chapter_menu.
  1178.         VALIDATE_CITATION(CITATION_REQUESTED, REQUEST_LENGTH, CITATION_TO_GET); 
  1179.  
  1180.         FILL_IN_CHAPTER_FILENAME(CHAP_FILENAME, CHAPTER_CHOICE_INT); 
  1181.         FIRST_LINE := CHAP_POINTERS(CITATION_TO_GET); 
  1182.  
  1183.  
  1184.         if PARAGRAPH_CHOICE_LEN_INT > 0 then 
  1185.           LAST_LINE := CHAP_POINTERS(LEGAL_CITATIONS'SUCC(CITATION_TO_GET)); 
  1186.           SCROLL_CHAP(CHAP_FILENAME, FIRST_LINE, LAST_LINE, SAVE_FILE, FALSE, 
  1187.             CITATION_REQUESTED); 
  1188.         else 
  1189.           if SECTION_CHOICE_LEN_INT <= 0 then 
  1190.  
  1191.           -----entire chapter
  1192.             SCROLL_CHAP(CHAP_FILENAME, FIRST_LINE, 0, SAVE_FILE, TRUE, 
  1193.               CITATION_REQUESTED); 
  1194.           else 
  1195.             NEXT_CITATION := CITATION_REQUESTED; 
  1196.             GET_NEXT_SECTION_NUMBER(NEXT_CITATION, LAST_LINE, UNTIL_EOF, 
  1197.               SUBSECTION); 
  1198.             SCROLL_CHAP(CHAP_FILENAME, FIRST_LINE, LAST_LINE, SAVE_FILE, 
  1199.               UNTIL_EOF, CITATION_REQUESTED); 
  1200.           end if; 
  1201.         end if; 
  1202.  
  1203.  
  1204.       exception
  1205.         when CONSTRAINT_ERROR => 
  1206.           PUT_LINE(ASCII.ESC & "[21;1H"); 
  1207.           --  put cursor at line 21, column 1
  1208.           NONEXISTENT_CITATION_MESSAGE := (others => ' '); 
  1209.           NONEXISTENT_CITATION_MESSAGE(1 .. 7) := "Chapter"; 
  1210.           NONEXISTENT_CITATION_MESSAGE(9 .. (8 + CHAPTER_CHOICE_LEN_INT)) := 
  1211.             CHAPTER_CHOICE(1 .. CHAPTER_CHOICE_LEN_INT); 
  1212.           PLACE := 10 + CHAPTER_CHOICE_LEN_INT; 
  1213.           if SECTION_CHOICE_LEN_INT > 0 then 
  1214.             NONEXISTENT_CITATION_MESSAGE(PLACE .. PLACE + 6) := "Section"; 
  1215.             PLACE := PLACE + 8; 
  1216.             NONEXISTENT_CITATION_MESSAGE(PLACE .. (PLACE + 
  1217.               SECTION_CHOICE_LEN_INT - 1)) := SECTION_CHOICE(1 .. 
  1218.               SECTION_CHOICE_LEN_INT); 
  1219.             PLACE := PLACE + SECTION_CHOICE_LEN_INT + 1; 
  1220.           end if; 
  1221.           if PARAGRAPH_CHOICE_LEN_INT > 0 then 
  1222.             NONEXISTENT_CITATION_MESSAGE(PLACE .. PLACE + 8) := "Paragraph"; 
  1223.             PLACE := PLACE + 10; 
  1224.             NONEXISTENT_CITATION_MESSAGE(PLACE .. (PLACE + 
  1225.               PARAGRAPH_CHOICE_LEN_INT - 1)) := PARAGRAPH_CHOICE(1 .. 
  1226.               PARAGRAPH_CHOICE_LEN_INT); 
  1227.             PLACE := PLACE + PARAGRAPH_CHOICE_LEN_INT + 1; 
  1228.           end if; 
  1229.           NONEXISTENT_CITATION_MESSAGE(PLACE .. PLACE + 24) := 
  1230.             "is not a valid reference."; 
  1231.           PUT_LINE(NONEXISTENT_CITATION_MESSAGE); 
  1232.           NEW_LINE; 
  1233.           -- Display "Please try again " message.
  1234.           PUT("  Please try again. "); 
  1235.           GET_LINE(NONEXISTENT_CITATION_REPLY, NONEXISTENT_CITATION_REPLY_LEN); 
  1236.  
  1237.           -- end of block for exception CONSTRAINT_ERROR
  1238.       end; 
  1239.  
  1240.     end loop; 
  1241.  
  1242.  
  1243.  
  1244.  
  1245.   end DO_CHAPTER_MENU; 
  1246.  
  1247. --------------------------------------------------------------------------
  1248. end LRM_NON_SMG; 
  1249.  
  1250. ------------------------------------------------------------------------------
  1251.